/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package restaurante.cdp;

import java.util.ArrayList;
import java.util.List;
import restaurante.cdp.interfaces.Funcionamento;
import restaurante.cdp.interfaces.Observador;
import restaurante.cdp.interfaces.PedidoFila;
import restaurante.cdp.interfaces.PedidoTempo;
import restaurante.cdp.enuns.SituacaoPedido;
import restaurante.cdp.interfaces.Sujeito;

/**
 *
 * @author a20101bsi0623
 */
public class Cozinha implements Sujeito{
    private List<Pedido> pedidosPendentes;
    private List<Pedido> pedidosElaboracao;
    private List<Pedido> pedidosProntos;
    private List<Observador> observadores;
    private Funcionamento funcionamento;
    public static Cozinha instance = null;
    
    
    public static Cozinha getInstance() {
        if (instance == null) {
            instance = new Cozinha();
        }
        return instance;
    }

    private Cozinha()
    {
        this.pedidosElaboracao = new ArrayList<>();
        this.pedidosPendentes = new ArrayList<>();
        this.pedidosProntos = new ArrayList<>();
        this.observadores = new ArrayList<>();
        this.funcionamento = new PedidoFila();
    }
    
    
    @Override
    public void notificar()
    {
        System.out.println("\nCozinha: Pedido Pronto");
    }

    public List<Pedido> getPedidosPendentes() {
        return pedidosPendentes;
    }

    public void setPedidosPendentes(List<Pedido> pedidosPendentes) {
        this.pedidosPendentes = pedidosPendentes;
    }

    public List<Pedido> getPedidosElaboracao() {
        return pedidosElaboracao;
    }

    public void setPedidosElaboracao(List<Pedido> pedidosElaboracao) {
        this.pedidosElaboracao = pedidosElaboracao;
    }

    public List<Pedido> getPedidosProntos() {
        return pedidosProntos;
    }

    public void setPedidosProntos(List<Pedido> pedidosProntos) {
        this.pedidosProntos = pedidosProntos;
    }

    public List<Observador> getObservadores() {
        return observadores;
    }

    public void setObservadores(List<Observador> observadores) {
        this.observadores = observadores;
    }

    public Funcionamento getFuncionamento() {
        return funcionamento;
    }

    public void setFuncionamento(Funcionamento funcionamento) {
        this.funcionamento = funcionamento;
    }
    
    

    @Override
    public void adicionar(Observador o) {
        observadores.add(o);
    }

    @Override
    public void remover(Observador o) {
        observadores.remove(o);
    }
    
    //Muda o modo de funcionamento da cozinha
    
    public void alterarModo(int f)
    {
        if(f==1){
            setFuncionamento(new PedidoFila()); 
            System.out.println("\nMODO DE FUNCIONAMENTO: Fila");
        }
            
        else{
            setFuncionamento(new PedidoTempo());
            System.out.println("\nMODO DE FUNCIONAMENTO: Menor Tempo Preparo");
        }
    }
    
    //Retorna o pedido que sera elaborado pelo cozinheiro
    public Pedido pedidoElaborando()
    {
        
        Pedido p;
        p = funcionamento.obterPedido(pedidosPendentes);
        pedidosElaboracao.add(p);
        pedidosPendentes.remove(p);
        p.setSituacao(SituacaoPedido.EM_ELABORACAO);
        p.calcTempoEspera();
        return p;
    }
    
    //Quando o cozinheiro termina um produto ele eh mudado de lista
    public Pedido pedidoPronto(Pedido p)
    {
        pedidosProntos.add(p);
        pedidosElaboracao.remove(p);
        p.setSituacao(SituacaoPedido.PRONTO);
        p.calcTempoElaboracao();
        return p;
    }
    
    //Retorna o pedido a ser entregue por algum entregador
    public Pedido pedidoEntregue()
    {
        Pedido p;
        p = pedidosProntos.get(0);
        pedidosProntos.remove(0);
        p.calcTempoEntrega();
        return p;
    }
    
    //Mostra os pedidos da cozinha
//    public void consutarCozinha()
//    {
//        System.out.println("\nPEDIDOS DA COZINHA\n");
//        System.out.print(">Pendentes:");
//        for (Pedido pedido : pedidosPendentes) {
//            System.out.print(" "+pedido.getNumeroLista());
//        }
//        System.out.print("\n>Em elaboracao:");
//        for (Pedido pedido : pedidosElaboracao) {
//            System.out.print(" "+pedido.getNumeroLista());
//        }
//        System.out.print("\n>Prontos:");
//        for (Pedido pedido : pedidosProntos) {
//            System.out.print(" "+pedido.getNumeroLista());
//        }
//        System.out.println("\n");
//    }
    
    
    
    
    
    
}

